package com.fivec.javaproject.generatebitaddress.code;
import com.fivec.javaproject.generatebitaddress.code.generatekeys.GenerateKey;
import com.fivec.javaproject.generatebitaddress.code.tools.Base58Util;
import com.fivec.javaproject.generatebitaddress.code.tools.IsValid;
import java.util.Arrays;
import static com.fivec.javaproject.generatebitaddress.code.tools.StaticMethod.getHash256;
import static com.fivec.javaproject.generatebitaddress.code.tools.StaticMethod.getRipemd160;

/**
 * @author wangyizhu
 * @version "1.8.0_131"
 * @email 2641956765@qq.com
 * @desc:
 * @Time 2021/12/06 17:15
 */
public class Main {
    public static void main(String[] args) {
        GenerateKey generateKey = new GenerateKey();
        byte[] pub = generateKey.getPubKey();
        /**3、对公钥进行双重hash计算：得到公钥哈希pub_hash
         ① 使用sha256算法对pub进行哈希计算，结果命名为pub_sha256
         ② 使用ripemd160算法对①中的结果进行哈希计算，结果命名为pub_hash*/
        byte[] pub_sha256=getHash256(pub);
        byte[] pub_hash=getRipemd160(pub_sha256);
        /**
         *在pub_hash前面，添加（0x00）版本号，组成的新序列命名为ver_pub_hash
         */
        byte[] a= {0x00};
        byte[] b= pub_hash;
        // 合并a,b结果命名为ver_pub_hash
        byte[] ver_pub_hash = new byte[a.length + b.length];
        System.arraycopy(a, 0, ver_pub_hash, 0, a.length);
        //src表示源数组，srcPos表示源数组要复制的起始位置，destPos  目标数组的起始位置.，desc表示目标数组，length表示要复制的长度。
        System.arraycopy(b, 0, ver_pub_hash, a.length, b.length);
        /**
         * 对ver_pub_hash进行双重sha256哈希计算,并得到校验码，命名为check
         * ① 第一次使用sha256进行哈希计算，得到的结果命名为ver_pub_hash1
         * ② 将①得到结果再次使用sha256进行哈希计算，得到的结果命名为ver_pub_hash2
         * ③ 取②中得到的结果的前四个字节，命名为check
         */
        byte[] ver_pub_hash1=getHash256(ver_pub_hash);
        byte[] ver_pub_hash2=getHash256(ver_pub_hash1);
        byte[] check = Arrays.copyOf(ver_pub_hash2,4);
        /**
         * 将check校验码拼接到ver_pub_hash后面，组成新的序列，命名为ver_pub_hash_check
         */
        byte[] ver_pub_hash_check=new byte[ver_pub_hash.length+check.length];
        System.arraycopy(ver_pub_hash, 0, ver_pub_hash_check, 0, ver_pub_hash.length);
        System.arraycopy(check, 0, ver_pub_hash_check, ver_pub_hash.length, check.length);
        /**
         * 将ver_pub_hash_check，使用base58进行编码，得到一个字符串结果，命名为address
         */
        String address = Base58Util.encode(ver_pub_hash_check);
        System.out.println("生成的地址为："+address);
        System.out.println(address+"这个地址为:"+ IsValid.Isvalidforadress(address));

    }
}
